home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume25 / ted / part06 < prev    next >
Encoding:
Text File  |  1991-11-06  |  53.6 KB  |  1,824 lines

  1. Newsgroups: comp.sources.misc
  2. From: dan%step.uucp@uunet.uu.net (Daniel Weaver)
  3. Subject:  v25i031:  ted - Terminfo/termcap test program, Part06/07
  4. Message-ID: <1991Nov6.043029.6125@sparky.imd.sterling.com>
  5. X-Md4-Signature: ece6574372eada19b576272192a1a955
  6. Date: Wed, 6 Nov 1991 04:30:29 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: dan%step.uucp@uunet.uu.net (Daniel Weaver)
  10. Posting-number: Volume 25, Issue 31
  11. Archive-name: ted/part06
  12. Environment: UNIX
  13.  
  14. #! /bin/sh
  15. # This is a shell archive.  Remove anything before this line, then feed it
  16. # into a shell via "sh file" or similar.  To overwrite existing files,
  17. # type "sh file -c".
  18. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  19. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  20. # If this archive is complete, you will see the following message at the end:
  21. #        "End of archive 6 (of 7)."
  22. # Contents:  modes.c output.c scan.c
  23. # Wrapped by dan@step on Fri Nov  1 11:28:28 1991
  24. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  25. if test -f 'modes.c' -a "${1}" != "-c" ; then 
  26.   echo shar: Will not clobber existing file \"'modes.c'\"
  27. else
  28. echo shar: Extracting \"'modes.c'\" \(19417 characters\)
  29. sed "s/^X//" >'modes.c' <<'END_OF_FILE'
  30. X/*
  31. X** This software is Copyright (c) 1991 by Daniel Weaver.
  32. X**
  33. X** Permission is hereby granted to copy, distribute or otherwise
  34. X** use any part of this package as long as you do not try to make
  35. X** money from it or pretend that you wrote it.  This copyright
  36. X** notice must be maintained in any copy made.
  37. X**
  38. X** Use of this software constitutes acceptance for use in an AS IS
  39. X** condition. There are NO warranties with regard to this software.
  40. X** In no event shall the author be liable for any damages whatsoever
  41. X** arising out of or in connection with the use or performance of this
  42. X** software.  Any use of this software is at the user's own risk.
  43. X**
  44. X**  If you make modifications to this software that you feel
  45. X**  increases it usefulness for the rest of the community, please
  46. X**  email the changes, enhancements, bug fixes as well as any and
  47. X**  all ideas to me. This software is going to be maintained and
  48. X**  enhanced as deemed necessary by the community.
  49. X*/
  50. X/* this module tests boolian flags and terminal modes */
  51. X
  52. X#include "curses.h"
  53. X#include "ted.h"
  54. X
  55. Xstatic void
  56. Xuprint(s)
  57. Xchar *s;
  58. X   {  /* underline string for (ul) test */
  59. X      if (s)
  60. X         while (*s) {
  61. X            put_str("_\b");
  62. X            putchp(*s++);
  63. X         }
  64. X   }
  65. X
  66. X
  67. X/* Note: uprint() sends underscore back-space character, and
  68. X        ucprint() sends character back-space underscore.  */
  69. X
  70. Xstatic void
  71. Xucprint(s)
  72. Xchar *s;
  73. X   {  /* underline string for (uc) test */
  74. X      if (s)
  75. X         while (*s) {
  76. X            putchp(*s++);
  77. X            putchp('\b');
  78. X            putp(underline_char);
  79. X         }
  80. X   }
  81. X
  82. X
  83. Xstatic void
  84. Xsubtest_tbc()
  85. X   {  /* test clear tabs (tbc) */
  86. X      int i;
  87. X
  88. X      put_clear();
  89. X      putp(clear_all_tabs);
  90. X      ptext("Clear tabs (tbc)");
  91. X      go_home();
  92. X      put_crlf();  putchp('\t');  putchp('T');
  93. X      go_home();
  94. X      put_newlines(2);
  95. X         for (i = 1; i < columns; i++) {
  96. X            putchp('.');
  97. X         }
  98. X      putchp('T');  go_home();
  99. X      ptext("\n\n\nDone. (tbc)");
  100. X   }
  101. X
  102. X
  103. Xstatic void
  104. Xsubtest_hts()
  105. X   {  /* set tabs with (hts), also (xt) glitch */
  106. X      int i, tabat;
  107. X
  108. X      put_clear();
  109. X      tabat = init_tabs;
  110. X      if (set_tab)
  111. X         {
  112. X            ptext("Tabs set with (hts)");
  113. X            put_crlf();
  114. X               for (i = 1; i < columns; i++) {
  115. X                  if (i % 8 == 1) putp(set_tab);
  116. X                  putchp(' ');
  117. X               }
  118. X            tabat = 8;
  119. X         }
  120. X      else
  121. X         {
  122. X            ptext("(hts) not defined.  The following tabs are set:");
  123. X         }
  124. X      go_home();
  125. X      put_newlines(2);
  126. X      if (tabat <= 0) tabat = 8;
  127. X         for (i = tabat; i < columns; i += tabat) {
  128. X            putchp('\t');  putchp('T');
  129. X         }
  130. X      go_home();
  131. X      put_newlines(3);
  132. X         for (i = 1; i < columns; i++) {
  133. X            putchp('.');
  134. X         }
  135. X      go_home();
  136. X      put_newlines(3);
  137. X         for (i = tabat; i < columns; i += tabat) {
  138. X            putchp('\t');  putchp('T');
  139. X         }
  140. X      go_home();
  141. X      put_newlines(4);
  142. X      putchp('.');
  143. X         for (i = 2; i < columns; i++) {
  144. X            if (i % tabat == 1) putchp('T');
  145. X            else putchp('.');
  146. X         }
  147. X      go_home();
  148. X      put_newlines(5);
  149. X      ptextln("The last two lines should be the same.");
  150. X
  151. X#if defined(SVR3) || defined(XENIX)
  152. X      if (!over_strike && (init_tabs > 0 || set_tab))
  153. X         {
  154. X            ptextln("\nDestructive tab test");
  155. X            ptext("(xt) should not ");  put_cr();
  156. X            ptext("(xt) should");
  157. X               while (char_count < 16) {
  158. X                  if (translate_mode && tab) putp(tab);
  159. X                  else putp(TM_tab);
  160. X                  char_count = ((char_count / tabat) + 1) * tabat;
  161. X               }
  162. X            putln("be set.");
  163. X            sprintf(temp, "(xt) is %s in the data base.",
  164. X               dest_tabs_magic_smso ? "true": "false");
  165. X            ptextln(temp);
  166. X         }
  167. X#endif
  168. X   }
  169. X
  170. Xstatic void
  171. Xsubtest_cbt()
  172. X   {  /* test back tab (cbt) */
  173. X      int i;
  174. X
  175. X      if (back_tab)
  176. X         {
  177. X            put_clear();
  178. X            ptext("Back tabs (cbt)");
  179. X            go_home();
  180. X            put_crlf();
  181. X               for (i = 1; i < columns; i++) {
  182. X                  putchp(' ');
  183. X               }
  184. X               for (i = 0; i < columns; i += 8) {
  185. X                  putp(back_tab);  putchp('T');
  186. X                  putp(back_tab);
  187. X               }
  188. X            go_home();
  189. X            put_newlines(2);
  190. X               for (i = 1; i < columns; i++) {
  191. X                  if (i % 8 == 1) putchp('T');
  192. X                  else putchp('.');
  193. X               }
  194. X            go_home();
  195. X            put_newlines(4);
  196. X         }
  197. X      else
  198. X         {
  199. X            if (init_tabs <= 0 && !set_tab)
  200. X               {
  201. X                  /* setupterm() resets (cbt) if both (it) and (hts) are
  202. X                     missing. */
  203. X                  ptextln("(it) and (hts) missing...  (cbt) back tab not tested!");
  204. X               }
  205. X            else ptextln("(cbt) back tab not present");
  206. X         }
  207. X   }
  208. X
  209. X
  210. Xstatic void
  211. Xtest_os_set()
  212. X   {  /* test (am) (smam) (rmam) (xenl) on overstrike terminals */
  213. X      int i, j;
  214. X
  215. X#if defined(SVR3) || defined(XENIX)
  216. X      if (exit_am_mode && can_go_home)
  217. X         {
  218. X            go_home();
  219. X            putp(exit_am_mode);
  220. X            ptext("\n(rmam) will     reset (am)");
  221. X            go_home();
  222. X               for (j = 0; j < columns; j++) put_this(' ');
  223. X            ptext("(rmam) will not reset (am)");
  224. X         }
  225. X      else ptext("(rmam) not present.");
  226. X
  227. X      if (enter_am_mode && can_go_home)
  228. X         {
  229. X            go_home();
  230. X            putp(enter_am_mode);
  231. X            ptext("\n\n\n(smam) will ");
  232. X            i = char_count;
  233. X            ptext("not set (am)");
  234. X            go_home();
  235. X            put_newlines(2);
  236. X               for (j = -i; j < columns; j++) put_this(' ');
  237. X            put_str("@@@");
  238. X         }
  239. X      else ptext("\n\n(smam) not present.");
  240. X#endif
  241. X
  242. X      if (can_go_home)
  243. X         {
  244. X            go_home();
  245. X            ptext("\n\n\n\n\n(am) should ");
  246. X            i = char_count;
  247. X            ptext("not be set");
  248. X            go_home();
  249. X            put_newlines(4);
  250. X               for (j = -i; j < columns; j++) put_this(' ');
  251. X            put_str("@@@");
  252. X            go_home();
  253. X            put_newlines(6);
  254. X         }
  255. X      else put_crlf();
  256. X      sprintf(temp, "(am) is %s in the data base",
  257. X         auto_right_margin ? "true" : "false");
  258. X      ptextln(temp);
  259. X
  260. X      ptext("\n(bw) should ");
  261. X      i = char_count;
  262. X      ptextln("not be set.");
  263. X         for (j = i; j < columns; j++) put_str("\b");
  264. X      put_str("@@@");
  265. X      put_crlf();
  266. X      sprintf(temp, "(bw) is %s in the data base",
  267. X         auto_left_margin ? "true" : "false");
  268. X      ptextln(temp);
  269. X   }
  270. X
  271. X
  272. Xstatic void
  273. Xsubtest_os_xenl()
  274. X   {  /* test (xenl) on overstrike terminals */
  275. X      int i, j, k;
  276. X
  277. X      if (can_go_home && can_clear_screen)
  278. X         {  /* (xenl) test */
  279. X            put_clear();
  280. X            /* this test must be done in raw mode.  Otherwise UNIX
  281. X               will translate CR to CRLF. */
  282. X            if (stty_query(TTY_OUT_TRANS)) tty_raw(1, char_mask);
  283. X            ptext("\nreset (xenl). Does ");
  284. X            i = char_count;
  285. X            put_str("not ignore CR, does ");
  286. X            k = char_count;
  287. X            put_str("not ignore LF");
  288. X            go_home();
  289. X               for (j = 0; j < columns; j++) put_this(' ');
  290. X            put_cr();
  291. X               for (j = 0; j < i; j++) putchp(' ');
  292. X            put_str("@@@\n@@");
  293. X            go_home();
  294. X               for (j = 0; j < columns; j++) put_this(' ');
  295. X            put_lf();
  296. X               for (j = 0; j < k; j++) putchp(' ');
  297. X            put_str("@@@\r@@");
  298. X            tty_set();
  299. X            go_home();
  300. X            put_newlines(4);
  301. X         }
  302. X      else ptextln("\n(xenl) not tested, (clear) (cup) or (home) missing");
  303. X      sprintf(temp, "(xenl) is %s in the data base",
  304. X         eat_newline_glitch ? "true" : "false");
  305. X      ptextln(temp);
  306. X   }
  307. X
  308. X
  309. Xstatic void
  310. Xtest_os_reset()
  311. X   {  /* test (am) (smam) (rmam) (xenl) on non-overstrike terminals */
  312. X      int i, j;
  313. X
  314. X#if defined(SVR3) || defined(XENIX)
  315. X      if (exit_am_mode && can_go_home)
  316. X         {
  317. X            go_home();
  318. X            putp(exit_am_mode);
  319. X            ptext("\n(rmam) will reset (am)");
  320. X            go_home();
  321. X               for (j = 0; j < columns; j++) put_this(' ');
  322. X            ptext("(rmam) will not reset (am) ");
  323. X            go_home();
  324. X            put_str("                          ");
  325. X         }
  326. X      else ptext("(rmam) not present.");
  327. X
  328. X      if (enter_am_mode && can_go_home)
  329. X         {
  330. X            go_home();
  331. X            putp(enter_am_mode);
  332. X            ptext("\n\n\n(smam) will not set (am)");
  333. X            go_home();
  334. X            put_newlines(2);
  335. X               for (j = 0; j < columns; j++) put_this(' ');
  336. X            ptext("(smam) will set (am)    ");
  337. X            go_home();
  338. X            put_str("\n\n                          ");
  339. X         }
  340. X      else ptext("\n\n(smam) not present.");
  341. X#endif
  342. X
  343. X      if (can_go_home)
  344. X         {
  345. X            go_home();
  346. X            ptext("\n\n\n\n\n(am) should not be set");
  347. X            go_home();
  348. X            put_newlines(4);
  349. X               for (j = 0; j < columns; j++) put_this(' ');
  350. X            ptext("(am) should be set    ");
  351. X            go_home();
  352. X            put_str("\n\n\n\n                       \n\n");
  353. X         }
  354. X      else put_crlf();
  355. X      sprintf(temp, "(am) is %s in the data base",
  356. X         auto_right_margin ? "true" : "false");
  357. X      ptextln(temp);
  358. X
  359. X      /* (ul) is used only if (os) is reset */
  360. X      sprintf(temp, "\n(ul) is %s in the data base",
  361. X         transparent_underline ? "true" : "false");
  362. X      ptextln(temp);
  363. X      sprintf(temp, "This text should %sbe underlined.",
  364. X         transparent_underline ? "" : "not ");
  365. X      uprint(temp);
  366. X      put_newlines(2);
  367. X      if (underline_char)
  368. X         {
  369. X            ptextln("Test underline character (uc)");
  370. X            ucprint("This text should be underlined.");
  371. X            put_newlines(2);
  372. X         }
  373. X      else
  374. X      if (!enter_underline_mode)
  375. X         ptextln("(uc) underline character, is not defined\n");
  376. X
  377. X      ptextln("(bw) should not be set.");
  378. X         for (i = 12; i < columns; i++) put_str("\b");
  379. X      if (delete_character)
  380. X         for (i = 0; i < 4; i++) putp(delete_character);
  381. X      else put_str("   ");
  382. X      put_crlf();
  383. X      sprintf(temp, "(bw) is %s in the data base",
  384. X         auto_left_margin ? "true" : "false");
  385. X      ptextln(temp);
  386. X   }
  387. X
  388. X
  389. Xstatic void
  390. Xsubtest_xenl()
  391. X   {  /* test (xenl) when (os) is reset */
  392. X      int j;
  393. X
  394. X      if (can_go_home)
  395. X         {  /* (xenl) test */
  396. X            put_clear();
  397. X            /* this test must be done in raw mode.  Otherwise UNIX
  398. X               will translate CR to CRLF. */
  399. X            if (stty_query(TTY_OUT_TRANS)) tty_raw(1, char_mask);
  400. X               for (j = 0; j < columns; j++) put_this(' ');
  401. X            put_cr();
  402. X            ptext("(xenl) should be set. Does not ignore CR");
  403. X            go_home();
  404. X            put_crlf();
  405. X               for (j = 0; j < columns; j++) put_this(' ');
  406. X            put_lf();  /* test (cud1) */
  407. X            ptext("(xenl) should be set. Ignores (cud1)");
  408. X            go_home();
  409. X            put_newlines(3);
  410. X            if (scroll_forward && cursor_down &&
  411. X               strcmp(scroll_forward, cursor_down))
  412. X               {
  413. X                     for (j = 0; j < columns; j++) put_this(' ');
  414. X                  put_ind();  /* test (ind) */
  415. X                  ptext("(xenl) should be set. Ignores (ind)");
  416. X                  go_home();
  417. X                  put_newlines(5);
  418. X               }
  419. X            tty_set();
  420. X            ptextln("If the above lines are blank then (xenl) should be false");
  421. X         }
  422. X      else ptextln("(xenl) not tested, (clear) (cup) or (home) missing");
  423. X      sprintf(temp, "(xenl) is %s in the data base",
  424. X         eat_newline_glitch ? "true" : "false");
  425. X      ptextln(temp);
  426. X   }
  427. X
  428. X
  429. Xtest_mode()
  430. X   {
  431. X      int i, j;
  432. X      char *s;
  433. X
  434. X      new_test(3);
  435. X      if (run_mode("(os)"))
  436. X         do {
  437. X            ptext("\n(os) should be true, not false.");  put_cr();
  438. X            ptextln("(os) should be           false.");
  439. X            sprintf(temp, "(os) is %s in the data base",
  440. X               over_strike ? "true" : "false");
  441. X            ptextln(temp);
  442. X         } while (repeat_test(FALSE));
  443. X
  444. X      if (run_mode("(smam)(rmam)(ul)(uc)(am)(bw)"))
  445. X         do {
  446. X            put_clear();
  447. X            if (over_strike) test_os_set();
  448. X            else test_os_reset();
  449. X         } while (repeat_test(FALSE));
  450. X
  451. X      if (run_mode("(xenl)(eo)(xmc)(xhp)"))
  452. X         do {
  453. X            if (over_strike) subtest_os_xenl();
  454. X            else subtest_xenl();
  455. X
  456. X            if (transparent_underline || over_strike || underline_char)
  457. X               {  /* test (eo) */
  458. X                  sprintf(temp, "\n(eo) is %s in the data base",
  459. X                     erase_overstrike ? "true" : "false");
  460. X                  ptextln(temp);
  461. X                  ptext("(eo) should ");
  462. X                  if (underline_char) ucprint("not");
  463. X                  else uprint("not");
  464. X                  put_cr();
  465. X                  ptextln("(eo) should     be set");
  466. X               }
  467. X
  468. X            if (enter_standout_mode)
  469. X               {
  470. X                  sprintf(temp, "\n(xmc) is %d", magic_cookie_glitch);
  471. X                  ptextln(temp);
  472. X                  j = magic_cookie_glitch * 8;
  473. X                     for (i = 0; i < j; i++) put_str(" ");
  474. X                  ptextln("        These two lines should line up.");
  475. X                  if (j > 0) char_count += j;
  476. X                     for (i = 0; i < 4; i++) {
  477. X                        put_mode(enter_standout_mode);
  478. X                        putchp(' ');
  479. X                        put_mode(exit_standout_mode);
  480. X                        putchp(' ');
  481. X                     }
  482. X                  ptextln("These two lines should line up.");
  483. X      
  484. X                  /* test (xhp) */
  485. X                  put_crlf();  put_mode(enter_standout_mode);
  486. X                  put_str("Stand out");  put_mode(exit_standout_mode);
  487. X                  put_cr();
  488. X                  ptextln("If any part of this line is standout then (xhp) should be set.");
  489. X                  sprintf(temp, "(xhp) is %s in the data base",
  490. X                     ceol_standout_glitch ? "true" : "false");
  491. X                  ptextln(temp);
  492. X               }
  493. X         } while (repeat_test(FALSE));
  494. X
  495. X      if (run_test(cursor_address,
  496. X         "(mir) and (msgr) not tested because (cup) is missing", FALSE))
  497. X         do {
  498. X            put_clear();
  499. X            if (enter_insert_mode != (char *)0 &
  500. X               exit_insert_mode != (char *)0)
  501. X               {
  502. X                  ptextln("If the block of X's are square then (mir) should be set. (smir) (rmir) (cup)");
  503. X                  i = line_count;
  504. X                  put_str("\nXXX\nXXX\nXXX\nXXX");
  505. X                  putp(enter_insert_mode);
  506. X                  s = tcup(cursor_address, i + 1, 0);
  507. X                  tputs(s, lines, putch);
  508. X                  putchp('x');
  509. X                  s = tcup(cursor_address, i + 2, 1);
  510. X                  tputs(s, lines, putch);
  511. X                  putchp('x');
  512. X                  s = tcup(cursor_address, i + 3, 2);
  513. X                  tputs(s, lines, putch);
  514. X                  putchp('x');
  515. X                  s = tcup(cursor_address, i + 4, 3);
  516. X                  tputs(s, lines, putch);
  517. X                  putchp('x');
  518. X                  putp(exit_insert_mode);
  519. X                  put_crlf();
  520. X               }
  521. X            else ptextln("(smir) (rmir) not present. (mir) not tested.");
  522. X            if ((enter_standout_mode && exit_standout_mode) ||
  523. X               (enter_alt_charset_mode && exit_alt_charset_mode))
  524. X               {
  525. X                  put_crlf();
  526. X                  ptext("If you see a diagonal line of standout X's then (msgr) should be set, if any of the blanks are standout then (msgr) should be reset. (smacs) (rmacs) (cup)");
  527. X                  i = line_count + 1;
  528. X                  tputs(tcup(cursor_address, i, 0), lines, putch);
  529. X                  put_mode(enter_alt_charset_mode);
  530. X                  put_crlf();
  531. X                  /* some versions of the wy-120 can not clear lines or
  532. X                     screen when in alt charset mode.  If (el) and (ed)
  533. X                     are defined then I can test them.  If they are not
  534. X                     defined then they can not break (msgr) */
  535. X                  putp(clr_eos);
  536. X                  putp(clr_eol);
  537. X                  put_mode(exit_alt_charset_mode);
  538. X                  put_mode(enter_standout_mode);
  539. X                  putchp('X');
  540. X                  tputs(tcup(cursor_address, i + 2, 1), lines, putch);
  541. X                  putchp('X');
  542. X                  tputs(tcup(cursor_address, i + 3, 2), lines, putch);
  543. X                  putchp('X');
  544. X                  tputs(tcup(cursor_address, i + 4, 3), lines, putch);
  545. X                  putchp('X');
  546. X                  put_mode(exit_standout_mode);
  547. X                  put_crlf();
  548. X                  putp(clr_eos);  /* OK if missing */
  549. X                  put_crlf();
  550. X               }
  551. X            else ptextln("(smso) (rmso) (smacs) (rmacs) not present. (msgr) not tested.");
  552. X            sprintf(temp, "(mir) is %s and (msgr) is %s in the data base",
  553. X               move_insert_mode ? "true" : "false",
  554. X               move_standout_mode ? "true" : "false");
  555. X            ptextln(temp);
  556. X         } while (repeat_test(FALSE));
  557. X
  558. X      if (run_test(clear_all_tabs,
  559. X         "Clear all tabs (tbc) not defined.", TRUE))
  560. X         do {
  561. X            subtest_tbc();
  562. X         } while (repeat_test(FALSE));
  563. X
  564. X      if (run_mode("(hts)(xt)"))
  565. X         do {
  566. X            subtest_hts();
  567. X         } while (repeat_test(FALSE));
  568. X
  569. X      if (run_mode("(cbt)(in)"))
  570. X         do {
  571. X            subtest_cbt();
  572. X
  573. X            if (enter_insert_mode && exit_insert_mode)
  574. X               {  /* test (in) */
  575. X                  ptextln("\nTesting (in) with (smir) and (rmir)");
  576. X                  putln("\tIf these two lines line up ...");
  577. X                  put_str("\tIf these two lines line up ...");
  578. X                  put_cr();
  579. X                  putp(enter_insert_mode);
  580. X                  putchp(' ');
  581. X                  putp(exit_insert_mode);
  582. X                  ptext("\nthen (in) should be set.  ");
  583. X                  sprintf(temp,
  584. X                     "(in) is %s in the data base.",
  585. X                     insert_null_glitch ? "true" : "false");
  586. X                  ptextln(temp);
  587. X               }
  588. X         } while (repeat_test(FALSE));
  589. X
  590. X      if (run_mode("(da)(db)")
  591. X         && can_clear_screen && scroll_reverse && scroll_forward)
  592. X         do {  /* test (da) and (db) */
  593. X            put_clear();
  594. X            if (scroll_reverse) ptext("(da) should be set\r");
  595. X            move_to(0, 0, lines - 1, 0, 3);
  596. X            if (scroll_forward) ptext("(db) should be set\r");
  597. X            putp(scroll_forward);
  598. X            move_to(lines - 1, 0, 0, 0, 3);
  599. X            putp(scroll_reverse);
  600. X            putp(scroll_reverse);
  601. X            move_to(0, 0, lines - 1, 0, 3);
  602. X            putp(scroll_forward);
  603. X            move_to(lines - 1, 0, 0, 0, 3);
  604. X            ptextln("\n\n\n\n\nIf the top line is blank then (da) should be false.");
  605. X            ptextln("If the bottom line is blank then (db) should be false.");
  606. X            sprintf(temp, "\n(da) is %s, and (db) is %s, in the data base.",
  607. X            memory_above ? "true" : "false",
  608. X            memory_below ? "true" : "false");
  609. X            ptextln(temp);
  610. X            line_count = lines;
  611. X         } while (repeat_test(FALSE));
  612. X   }
  613. END_OF_FILE
  614. if test 19417 -ne `wc -c <'modes.c'`; then
  615.     echo shar: \"'modes.c'\" unpacked with wrong size!
  616. fi
  617. # end of 'modes.c'
  618. fi
  619. if test -f 'output.c' -a "${1}" != "-c" ; then 
  620.   echo shar: Will not clobber existing file \"'output.c'\"
  621. else
  622. echo shar: Extracting \"'output.c'\" \(23144 characters\)
  623. sed "s/^X//" >'output.c' <<'END_OF_FILE'
  624. X/*
  625. X** This software is Copyright (c) 1991 by Daniel Weaver.
  626. X**
  627. X** Permission is hereby granted to copy, distribute or otherwise
  628. X** use any part of this package as long as you do not try to make
  629. X** money from it or pretend that you wrote it.  This copyright
  630. X** notice must be maintained in any copy made.
  631. X**
  632. X** Use of this software constitutes acceptance for use in an AS IS
  633. X** condition. There are NO warranties with regard to this software.
  634. X** In no event shall the author be liable for any damages whatsoever
  635. X** arising out of or in connection with the use or performance of this
  636. X** software.  Any use of this software is at the user's own risk.
  637. X**
  638. X**  If you make modifications to this software that you feel
  639. X**  increases it usefulness for the rest of the community, please
  640. X**  email the changes, enhancements, bug fixes as well as any and
  641. X**  all ideas to me. This software is going to be maintained and
  642. X**  enhanced as deemed necessary by the community.
  643. X*/
  644. X/* terminfo test program common subroutines */
  645. X
  646. X#include "curses.h"
  647. X#include "ted.h"
  648. X
  649. Xstatic char *c0[32] = {"NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK",
  650. X   "BEL", "BS", "HT", "LF", "VT", "FF", "CR", "SO", "SI",
  651. X   "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB",
  652. X   "CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US"};
  653. X
  654. Xstatic char *c1[32] = {"", "", "", "", "IND", "NEL", "SSA", "ESA",
  655. X   "HTS", "HTJ", "VTS", "PLD", "PLU", "RI", "SS2", "SS3",
  656. X   "DCS", "PU1", "PU2", "STS", "CCH", "MW", "SPA", "EPA",
  657. X   "", "", "", "CSI", "ST", "OSC", "PM", "APC"};
  658. X
  659. X/* these data structures keep tabs on which capibilities can be tested
  660. X   by this program.  Entries in this table are terminfo names. */
  661. X#define NP_SIZE 16
  662. Xstatic char ns[4096];  /* storage space for the actual names */
  663. Xstatic char *np[NP_SIZE];  /* pointers into ns[] sorted by length */
  664. X
  665. Xint
  666. Xgetnext(mask)
  667. Xint mask;
  668. X   {  /* get the next character without scan mode conversion */
  669. X      int ch;
  670. X      unsigned char buf;
  671. X
  672. X#ifdef SVR3_2
  673. X      putp(req_for_input);
  674. X#endif
  675. X      fflush(stdout);
  676. X      if (nodelay_read)
  677. X         while (1) {
  678. X            ch = read(fileno(stdin), &buf, 1);
  679. X            if (ch == -1) return EOF;
  680. X            if (ch == 1) return buf;
  681. X         }
  682. X      ch = getchar();
  683. X      if (ch == EOF) return EOF;
  684. X      return ch & mask;
  685. X   }
  686. X
  687. X
  688. Xint
  689. Xgetchp(mask)
  690. Xint mask;
  691. X   {  /* read a character with scan mode conversion */
  692. X      if (scan_mode)
  693. X         {
  694. X#ifdef SVR3_2
  695. X            putp(req_for_input);
  696. X#endif
  697. X            fflush(stdout);
  698. X            return scan_key();
  699. X         }
  700. X      else return getnext(mask);
  701. X   }
  702. X
  703. X
  704. Xvoid
  705. Xputch(c)
  706. Xint c;
  707. X   {  /* output one character */
  708. X      char_sent++;
  709. X      putchar(c);
  710. X   }
  711. X
  712. X
  713. Xvoid
  714. Xput_this(c)
  715. Xint c;
  716. X   {  /* output one character (with padding) */
  717. X      putch(c);
  718. X      if (char_padding && replace_mode) putp(char_padding);
  719. X   }
  720. X
  721. X
  722. Xvoid
  723. Xput_cr()
  724. X   {
  725. X      if (translate_mode && carriage_return)
  726. X         tputs(carriage_return, char_count, putch);
  727. X      else tputs(TM_carriage_return, char_count, putch);
  728. X      char_count = 0;
  729. X   }
  730. X
  731. X
  732. Xvoid
  733. Xput_lf()
  734. X   {  /* send a linefeed (only works in RAW or CBREAK mode) */
  735. X      if (translate_mode && cursor_down) putp(cursor_down);
  736. X      else putp(TM_cursor_down);
  737. X      line_count++;
  738. X   }
  739. X
  740. X
  741. Xvoid
  742. Xput_ind()
  743. X   {  /* scroll forward (only works in RAW or CBREAK mode) */
  744. X      if (translate_mode && scroll_forward) putp(scroll_forward);
  745. X      else putp(TM_scroll_forward);
  746. X      line_count++;
  747. X   }
  748. X
  749. X
  750. Xvoid
  751. Xput_crlf()
  752. X   {  /* send carriage return, linefeed */
  753. X      if (translate_mode && newline) putp(newline);
  754. X      else putp(TM_newline);
  755. X      char_count = 0;
  756. X      line_count++;
  757. X   }
  758. X
  759. X
  760. Xvoid
  761. Xput_newlines(n)
  762. Xint n;
  763. X   {  /* put n newlines */
  764. X         while (n-- > 0) {
  765. X            put_crlf();
  766. X         }
  767. X   }
  768. X
  769. X
  770. Xvoid
  771. Xputchp(c)
  772. Xchar c;
  773. X   {  /* send a character to the terminal */
  774. X      switch (c) {
  775. X         case '\b':
  776. X            if (translate_mode && cursor_left) putp(cursor_left);
  777. X            else putp(TM_cursor_left);
  778. X            char_count--;
  779. X            break;
  780. X         case 7:
  781. X            if (translate_mode && bell) putp(bell);
  782. X            else putp(TM_bell);
  783. X            break;
  784. X         case '\f':
  785. X            if (translate_mode && form_feed) putp(form_feed);
  786. X            else putp(TM_form_feed);
  787. X            char_count = 0;
  788. X            line_count++;
  789. X            break;
  790. X         case '\n':
  791. X            put_crlf();
  792. X            break;
  793. X         case '\r':
  794. X            put_cr();
  795. X            break;
  796. X         case '\t':
  797. X            if (translate_mode && tab) putp(tab);
  798. X            else putp(TM_tab);
  799. X            char_count = ((char_count / 8) + 1) * 8;
  800. X            break;
  801. X         default:
  802. X            put_this(c);
  803. X            char_count++;
  804. X            break;
  805. X      }
  806. X   }
  807. X
  808. X
  809. Xvoid
  810. Xput_str(s)
  811. Xchar *s;
  812. X   {  /* send the string to the terminal */
  813. X      for (; *s; putchp(*s++));
  814. X   }
  815. X
  816. X
  817. Xvoid
  818. Xput_columns(s, len, w)
  819. Xchar *s;
  820. Xint len, w;
  821. X   {  /* put out s in column format */
  822. X      int l;
  823. X
  824. X      if (char_count + w > columns) put_crlf();
  825. X      l = char_count % w;
  826. X      if (l)
  827. X         while (l < w) {
  828. X            putchp(' ');
  829. X            l++;
  830. X         }
  831. X      if (char_count && char_count + len >= columns) put_crlf();
  832. X      l = char_count;
  833. X      put_str(s);
  834. X      char_count = l + len;
  835. X   }
  836. X
  837. X
  838. Xvoid
  839. Xputln(s)
  840. Xchar *s;
  841. X   {  /* output a string followed by a CR LF */
  842. X      for (; *s; putchp(*s++));
  843. X      put_crlf();
  844. X   }
  845. X
  846. X
  847. Xvoid
  848. Xptext(s)
  849. Xchar *s;
  850. X   {  /* output a string but do not assume the terminal will wrap
  851. X         to a new line.  Break the line at a word boundry then send
  852. X         a CR LF.  This is more estetic on 40 column terminals. */
  853. X      char *t, *x;
  854. X
  855. X      while (*s) {
  856. X            for (t = s + 1; *t > ' '; t++) ;
  857. X         if (char_count != 0 & (t - s) + char_count >= columns) {
  858. X               put_crlf();
  859. X               while (*s == ' ') s++;
  860. X         }
  861. X#ifdef TESTCAP
  862. X         /* We use terminfo in the text and convert it to termcap
  863. X            at the very last moment.  The conversion is done on the
  864. X            fly because termcap has no standard and the name may change
  865. X            from one application to the next.  */
  866. X            for (x = t - 1; x > s; x--)
  867. X               if (*x == ')')
  868. X                  while (s < t) {
  869. X                     if (*s == '(')
  870. X                        {  /* convert terminfo names to termcap names */
  871. X                           int i;
  872. X
  873. X                           i = cap_index(s + 1, x - s - 1);
  874. X                           if (i >= 0)
  875. X                              {
  876. X                                 putchp(LEFT_BRACE);
  877. X                                 put_str(&captrans[i][x - s]);
  878. X                                 putchp(RIGHT_BRACE);
  879. X                                 s = x + 1;
  880. X                              }
  881. X                           break;
  882. X                        }
  883. X                     else putchp(*s++);
  884. X                  }
  885. X#endif
  886. X            while (s < t) {
  887. X               putchp(*s++);
  888. X            }
  889. X      }
  890. X   }
  891. X
  892. X
  893. Xvoid
  894. Xput_dec(f, i)
  895. Xchar *f;
  896. Xint i;
  897. X   {  /* print a line with a decimal number in it */
  898. X      char tm[128];
  899. X
  900. X      sprintf(tm, f, i / 10, i % 10);
  901. X      ptext(tm);
  902. X   }
  903. X
  904. X
  905. Xvoid
  906. Xthree_digit(tx, i)
  907. Xchar *tx;
  908. Xint i;
  909. X   {  /* convert the decimal number to a string of at least 3 digits */
  910. X      if (i < 1000)
  911. X         sprintf(tx, "%d.%d", i / 10, i % 10);
  912. X      else sprintf(tx, "%d", i / 10);
  913. X   }
  914. X
  915. X
  916. Xvoid
  917. Xptextln(s)
  918. Xchar *s;
  919. X   {  /* print the text using ptext() then add a CR LF */
  920. X      ptext(s);
  921. X      put_crlf();
  922. X   }
  923. X
  924. X
  925. Xstatic void
  926. Xexpand_one(ch, v)
  927. Xint ch;
  928. Xchar **v;
  929. X   {   /* expand one character */
  930. X      char *t = *v;
  931. X
  932. X      if (ch & 0x80)
  933. X         {  /* dump it in octal (yuck) */
  934. X            *t++ = '\\';
  935. X            *t++ = '0' + ((ch >> 6) & 3);
  936. X            *t++ = '0' + ((ch >> 3) & 7);
  937. X            *t++ = '0' + (ch & 7);
  938. X            expand_chars += 4;
  939. X         }
  940. X      else
  941. X      if (ch == 127)
  942. X         {  /* DEL */
  943. X            *t++ = '^';  *t++ = '?';
  944. X            expand_chars += 2;
  945. X         }
  946. X      else
  947. X      if (ch >= ' ')
  948. X         {
  949. X            *t++ = ch;
  950. X            expand_chars++;
  951. X         }
  952. X      else
  953. X         {  /* control characters */
  954. X            *t++ = '^';  *t++ = ch + '@';
  955. X            expand_chars += 2;
  956. X         }
  957. X      *v = t;
  958. X   }
  959. X
  960. X
  961. Xchar *
  962. Xexpand(s)
  963. Xchar *s;
  964. X   {  /* convert the string to printable form */
  965. X      static char buf[4096];
  966. X      char *t, *v;
  967. X      int ch;
  968. X
  969. X      if (magic_cookie_glitch <= 0 && exit_attribute_mode)
  970. X         v = enter_reverse_mode;
  971. X      else v = NULL;
  972. X
  973. X      expand_chars = 0;
  974. X      t = buf;
  975. X      if (s)
  976. X         for ( ; ch = *s; s++) {
  977. X            if ((ch & 0x80) && v)
  978. X               {  /* print it in reverse video mode */
  979. X#ifdef SVR3_2
  980. X                  strcpy(t, liberated(tparm(v)));
  981. X#else
  982. X                  strcpy(t, liberated(v));
  983. X#endif
  984. X                     for ( ; *t; t++);
  985. X                  expand_one(ch & 0x7f, &t);
  986. X#ifdef SVR3_2
  987. X                  strcpy(t, liberated(tparm(exit_attribute_mode)));
  988. X#else
  989. X                  strcpy(t, liberated(exit_attribute_mode));
  990. X#endif
  991. X                     for ( ; *t; t++);
  992. X               }
  993. X            else expand_one(ch, &t);
  994. X         }
  995. X      *t = '\0';
  996. X      return buf;
  997. X   }
  998. X
  999. X
  1000. Xchar *
  1001. Xprint_expand(s)
  1002. Xchar *s;
  1003. X   {  /* convert the string to 7-bit printable form */
  1004. X      static char buf[4096];
  1005. X      char *t;
  1006. X      int ch;
  1007. X
  1008. X      expand_chars = 0;
  1009. X      t = buf;
  1010. X      if (s)
  1011. X         for ( ; ch = *s; s++) {
  1012. X            expand_one(ch, &t);
  1013. X         }
  1014. X      *t = '\0';
  1015. X      return buf;
  1016. X   }
  1017. X
  1018. X
  1019. Xchar *
  1020. Xexpand_to(s, l)
  1021. Xchar *s;
  1022. Xint l;
  1023. X   {  /* expand s to length l */
  1024. X      char *t;
  1025. X
  1026. X         for (s = t = expand(s); *t; t++)
  1027. X            ;
  1028. X         for ( ; expand_chars < l; expand_chars++) {
  1029. X            *t++ = ' ';
  1030. X         }
  1031. X      *t = '\0';
  1032. X      return s;
  1033. X   }
  1034. X
  1035. X
  1036. Xchar *
  1037. Xhex_expand_to(s, l)
  1038. Xchar *s;
  1039. Xint l;
  1040. X   {  /* expand s to length l in hex */
  1041. X      static char buf[128];
  1042. X      char *t;
  1043. X
  1044. X         for (t = buf; *s; s++) {
  1045. X            sprintf(t, "%02X ", *s & 0xff);
  1046. X            t += 3;
  1047. X         }
  1048. X         for ( ; t - buf < l; ) {
  1049. X            *t++ = ' ';
  1050. X         }
  1051. X      *t = '\0';
  1052. X      expand_chars = t - buf;
  1053. X      return buf;
  1054. X   }
  1055. X
  1056. X
  1057. Xchar *
  1058. Xexpand_command(c)
  1059. Xchar *c;
  1060. X   {  /* expand an ANSI escape sequence */
  1061. X      static char buf[256];
  1062. X      int i, j, ch;
  1063. X      char *s;
  1064. X
  1065. X      s = buf;
  1066. X         for (i = FALSE; ch = (*c & 0xff); c++) {
  1067. X            if (i) *s++ = ' ';
  1068. X            i = TRUE;
  1069. X            if (ch < 32)
  1070. X               {
  1071. X                  j = c[1] & 0xff;
  1072. X                  if (ch == A_ESC && j >= '@' && j <= '_')
  1073. X                     {
  1074. X                        ch = j - '@';
  1075. X                        c++;
  1076. X                           for (j = 0; *s = c1[ch][j++]; s++);
  1077. X                     }
  1078. X                  else
  1079. X                     for (j = 0; *s = c0[ch][j++]; s++);
  1080. X               }
  1081. X            else
  1082. X               {
  1083. X                  *s++ = ch;
  1084. X                  j = c[1] & 0xff;
  1085. X                  if (ch >= '0' && ch <= '9' &&
  1086. X                      j >= '0' && j <= '9') i = FALSE;
  1087. X               }
  1088. X         }
  1089. X      *s = '\0';
  1090. X      return buf;
  1091. X   }
  1092. X
  1093. X
  1094. Xvoid
  1095. Xgo_home()
  1096. X   {  /* move the cursor to the home position */
  1097. X      int i;
  1098. X
  1099. X      if (cursor_home) putp(cursor_home);
  1100. X      else
  1101. X      if (cursor_address) 
  1102. X         tputs(tcup(cursor_address, 0, 0), lines, putch);
  1103. X      else
  1104. X      if (row_address)
  1105. X         {  /* use (vpa) */
  1106. X            put_cr();
  1107. X            tputs(tparm(row_address, 0), 1, putch);
  1108. X         }
  1109. X      else
  1110. X      if (cursor_up && cursor_to_ll)
  1111. X         {
  1112. X            putp(cursor_to_ll);
  1113. X            for (i = 1; i < lines; i++) putp(cursor_up);
  1114. X         }
  1115. X      else
  1116. X         {
  1117. X            can_go_home = FALSE;
  1118. X            return;
  1119. X         }
  1120. X      char_count = line_count = 0;
  1121. X      can_go_home = TRUE;
  1122. X   }
  1123. X
  1124. X
  1125. Xvoid
  1126. Xhome_down()
  1127. X   {  /* move the cursor to the lower left hand corner */
  1128. X      int i;
  1129. X
  1130. X      if (cursor_to_ll) putp(cursor_to_ll);
  1131. X      else
  1132. X      if (cursor_address) 
  1133. X         tputs(tcup(cursor_address, lines - 1, 0), lines, putch);
  1134. X      else
  1135. X      if (row_address)
  1136. X         {  /* use (vpa) */
  1137. X            put_cr();
  1138. X            tputs(tparm(row_address, lines - 1), 1, putch);
  1139. X         }
  1140. X      else
  1141. X      if (cursor_down && cursor_home)
  1142. X         {
  1143. X            putp(cursor_home);
  1144. X               for (i = 1; i < lines; i++) putp(cursor_down);
  1145. X         }
  1146. X      else return;
  1147. X      char_count = 0;
  1148. X      line_count = lines - 1;
  1149. X   }
  1150. X
  1151. X
  1152. Xvoid
  1153. Xput_clear()
  1154. X   {  /* clear the screen */
  1155. X      int i;
  1156. X
  1157. X      if (clear_screen) tputs(clear_screen, lines, putch);
  1158. X      else
  1159. X      if (clr_eos && can_go_home)
  1160. X         {
  1161. X            go_home();  
  1162. X            tputs(clr_eos, lines, putch);
  1163. X         }
  1164. X      else
  1165. X      if (scroll_forward && !over_strike && (can_go_home || cursor_up))
  1166. X         {
  1167. X            /* clear the screen by scrolling */
  1168. X            put_cr();
  1169. X            if (cursor_to_ll) putp(cursor_to_ll);
  1170. X            else
  1171. X            if (cursor_address) 
  1172. X               tputs(tcup(cursor_address, lines - 1, 0), lines, putch);
  1173. X            else
  1174. X            if (row_address)
  1175. X                  tputs(tparm(row_address, lines - 1), 1, putch);
  1176. X            else for (i = 1; i < lines; i++) putp(scroll_forward);
  1177. X
  1178. X            for (i = 1; i < lines; i++) putp(scroll_forward);
  1179. X
  1180. X            if (can_go_home) go_home();
  1181. X            else for (i = 1; i < lines; i++) putp(cursor_up);
  1182. X         }
  1183. X      else
  1184. X         {
  1185. X            can_clear_screen = FALSE;
  1186. X            return;
  1187. X         }
  1188. X      char_count = line_count = 0;
  1189. X      can_clear_screen = TRUE;
  1190. X   }
  1191. X
  1192. X
  1193. Xint
  1194. Xtty_sync_error()
  1195. X{   /* send an ENQ and wait for the ACK */
  1196. X      int ch, ct, trouble, ack;
  1197. X      long read_time;
  1198. X
  1199. X      trouble = FALSE;
  1200. X         for ( ; ; ) {
  1201. X            putp(tty_ENQ);  /* send ENQ */
  1202. X            ch = getnext(STRIP_PARITY);
  1203. X            read_time = time(0);  /* start the timer */
  1204. X            tty_ACK[ack = 0] = ch;
  1205. X               for (ct = junk_chars; ct > 0; ct--) {
  1206. X                  if (ch == ACK_char) return trouble;
  1207. X                  ch = getnext(STRIP_PARITY);
  1208. X                  if (ack < TTY_ACK_SIZE - 1) tty_ACK[++ack] = ch;
  1209. X               }
  1210. X            tty_ACK[ack + 1] = '\0';
  1211. X            if (ch == ACK_char) return trouble;
  1212. X            if (tty_can_sync != 2)
  1213. X               {  /* called from verify_time() */
  1214. X                  put_crlf();
  1215. X                  putln("Terminal did not respond to ENQ");
  1216. X                  tty_can_sync = FALSE;
  1217. X                  return (ch | 4096);
  1218. X               }
  1219. X            /* If we get here the terminal is sending too many
  1220. X               characters.  The trick is to find out if the characters
  1221. X               are comming from the terminal or the user.  We assume
  1222. X               the terminal will send only while it is processing
  1223. X               commands in its buffer, and that the buffer will empty
  1224. X               in a short poriod of time.  Any characters sent after
  1225. X               a few seconds must be from the user.  */
  1226. X
  1227. X               do {
  1228. X                  ch = getchp(STRIP_PARITY);
  1229. X                  if (time(0) - read_time > 3)
  1230. X                     {
  1231. X                        putchp(7);  /* ring the bell */
  1232. X                        break;
  1233. X                     }
  1234. X               } while (ch != 'c' && ch != 'C');
  1235. X            set_attr(0);  /* just in case */
  1236. X            putln(" -- synch -- ");
  1237. X            trouble = TRUE;
  1238. X         }
  1239. X   }
  1240. X
  1241. X
  1242. Xint
  1243. Xenq_ack()
  1244. X   {  /* send an ENQ, get an ACK */
  1245. X      int sync_error;
  1246. X
  1247. X         for (sync_error = 0; tty_sync_error(); sync_error++) {
  1248. X            sleep(1);
  1249. X            if (sync_error > 2)
  1250. X               {
  1251. X                  ptext("\nPad processing terminated...");
  1252. X                  (void) wait_here();
  1253. X                  time_pad = FALSE;
  1254. X                  return FALSE;
  1255. X               }
  1256. X         }
  1257. X      char_sent = 0;
  1258. X      start_time = time(0);
  1259. X      return TRUE;
  1260. X   }
  1261. X
  1262. X
  1263. Xint
  1264. Xwait_here()
  1265. X   {  /* read one character from the input stream */
  1266. X      char ch, cc[64];
  1267. X      char message[16];
  1268. X      int i, j;
  1269. X
  1270. X      /* Wait for CR or LF if we are not in RAW mode */
  1271. X         for (i = 0; ; i++) {
  1272. X            cc[i] = ch = getchp(STRIP_PARITY);
  1273. X            if (ch == '\r' | ch == '\n')
  1274. X               {
  1275. X                  put_crlf();
  1276. X                  char_sent = 0;
  1277. X                  return cc[i ? i - 1 : 0];
  1278. X               }
  1279. X            if (ch >= ' ')
  1280. X               {
  1281. X                  if (stty_query(TTY_CHAR_MODE))
  1282. X                     {
  1283. X                        put_crlf();
  1284. X                        char_sent = 0;
  1285. X                        return ch;
  1286. X                     }
  1287. X                  continue;
  1288. X               }
  1289. X            if (ch == 023)  /* Control S */
  1290. X               {
  1291. X                  /* ignore control S, but tell me about it */
  1292. X                     while (ch == 023 | ch == 021) {
  1293. X                        ch = getchp(STRIP_PARITY);
  1294. X                        if (i < sizeof(cc)) cc[++i] = ch;
  1295. X                     }
  1296. X                  put_str("\nThe terminal sent a ^S -");
  1297. X                     for (j = 0; j <= i; j++) {
  1298. X                        sprintf(message, " %02X", cc[j] & 0xFF);
  1299. X                        put_str(message);
  1300. X                     }
  1301. X                  put_crlf();
  1302. X                  i = -1;
  1303. X               }
  1304. X            else
  1305. X            if (ch != 021)  /* Control Q */
  1306. X               { /* could be abort character */
  1307. X                  sleep(1);
  1308. X                  if (tty_can_sync == 2)
  1309. X                     for (j = 1; j < 5; j++) {
  1310. X                        if (!tty_sync_error()) break;
  1311. X                        sleep(1);
  1312. X                     }
  1313. X                  put_str("\nHit 'c' to continue");
  1314. X                  ch = getchp(STRIP_PARITY);
  1315. X                  put_crlf();
  1316. X                  if (ch != 'c' & ch != 'C') bye_kids(1);
  1317. X                  char_sent = 0;
  1318. X                  return ch;
  1319. X               }
  1320. X         }
  1321. X   }
  1322. X
  1323. X
  1324. Xmaybe_wait(n)
  1325. Xint n;
  1326. X   {  /* wait if near the end of the screen, then clear screen */
  1327. X      if (line_count + n >= lines)
  1328. X         {
  1329. X            if (char_sent != 0) (void) wait_here();
  1330. X            put_clear();
  1331. X         }
  1332. X      else put_crlf();
  1333. X   }
  1334. X
  1335. X
  1336. Xnew_test(n)
  1337. Xint n;
  1338. X   {  /* if I have room, begin the test else clear the screen */
  1339. X      /* this function is used after a call to wait_here() */
  1340. X      if (line_count + n >= lines) put_clear();
  1341. X   }
  1342. X
  1343. X
  1344. Xstatic void
  1345. Xenter_name(s, l)
  1346. Xchar *s;
  1347. Xint l;
  1348. X   {  /* enter a new cap into the name space list if it is new */
  1349. X      int i;
  1350. X      char *t, *f;
  1351. X
  1352. X      if (l == 0 | l >= NP_SIZE) return;
  1353. X      if (np[0] == NULL)
  1354. X         for (i = 0; i < NP_SIZE; i++) {
  1355. X            np[i] = &ns[sizeof(ns) - 1];
  1356. X         }
  1357. X         for (t = np[l - 1]; t < np[l]; t += l) {
  1358. X            if (!strncmp(t, s, l)) return;
  1359. X         }
  1360. X      /* a new entry */
  1361. X      if (np[0] - l < ns) return;  /* no room */
  1362. X      f = np[0];
  1363. X         for (t = np[0] - l; f < np[l - 1]; *t++ = *f++);
  1364. X         for (i = 0; i < l; i++) np[i] -= l;
  1365. X         for ( ; l--; *t++ = *s++);
  1366. X   }
  1367. X
  1368. X
  1369. Xvoid
  1370. Xcap_test(s)
  1371. Xchar *s;
  1372. X   {  /* routine for termcaps that have no terminfo equivalents */
  1373. X      if (s)
  1374. X         {
  1375. X            sprintf(temp, ":%s", s);
  1376. X            enter_name(temp, strlen(temp));
  1377. X         }
  1378. X   }
  1379. X
  1380. X
  1381. Xvoid
  1382. Xcan_test(s)
  1383. Xchar *s;
  1384. X   {  /* caps that are actually tested come here */
  1385. X      char *t;
  1386. X
  1387. X      if (!s) return;
  1388. X      if (*s != '(') {
  1389. X         enter_name(s, strlen(s));
  1390. X         return;
  1391. X      }
  1392. X         for ( ; ; ) {
  1393. X            for ( ; *s != '('; s++) {
  1394. X               if (!*s) return;
  1395. X            }
  1396. X            for (t = ++s; *s != ')'; s++) {
  1397. X               if (!*s) return;
  1398. X            }
  1399. X            if (s - t < NP_SIZE) enter_name(t, s - t);
  1400. X         }
  1401. X   }
  1402. X
  1403. X
  1404. X#ifdef TESTCAP
  1405. Xvoid
  1406. Xreport_known(nx, nc)
  1407. Xchar **nx;
  1408. Xint nc;
  1409. X   {  /* scan the termcap entry and report any unknown capibilities */
  1410. X      extern char cap_entry[];
  1411. X      int i, first_one;
  1412. X      char *s, *t;
  1413. X
  1414. X      ptextln("Termcap definition:");
  1415. X      t = temp;
  1416. X      expand_chars = 0;
  1417. X         for (s = cap_entry; *s; s++) {
  1418. X            if (*s == ':' && s[1] == '\t' && s[2] == ':')
  1419. X               {
  1420. X                  s += 2;
  1421. X                  if (expand_chars > 10) expand_chars = columns;
  1422. X               }
  1423. X            expand_one(*s, &t);
  1424. X            if (*s == ':' && expand_chars + 20 > columns)
  1425. X               {
  1426. X                  *t = '\0';
  1427. X                  put_str(temp);
  1428. X                  put_str("\\\n\t:");
  1429. X                  t = temp;
  1430. X                  expand_chars = 0;
  1431. X               }
  1432. X         }
  1433. X      *t = '\0';
  1434. X      if (temp[0]) put_str(temp);
  1435. X      put_crlf();
  1436. X      first_one = 1;
  1437. X         for (s = cap_entry; *s; ) {
  1438. X            /* find a : */
  1439. X               for ( ; *s && *s != ':'; s++);
  1440. X            if (!*s) break;
  1441. X            /* scan past white space */
  1442. X               for (s++; *s && (*s == ' ' || *s == '\t' || *s == '\n'); s++);
  1443. X            /* find the end of the cap name */
  1444. X               for (t = s; *s && *s != ':' && *s != '=' && *s != '#'; s++);
  1445. X            if (s != t)
  1446. X               for (i = 0; strncmp(nx[i], t, s - t) != 0; i++) {
  1447. X                  if (i >= nc)
  1448. X                     {
  1449. X                        if (first_one)
  1450. X                           ptextln("Untested termcap entries:");
  1451. X                        first_one = 0;
  1452. X                           for ( ; *s && *s != ':'; s++);
  1453. X                        strncpy(temp, t, s - t);
  1454. X                        temp[s - t] = '\0';
  1455. X                        ptext("    ");
  1456. X                        ptextln(temp);
  1457. X                        break;
  1458. X                     }
  1459. X               }
  1460. X         }
  1461. X      if (first_one)
  1462. X         ptextln("All termcap entries can be tested.");
  1463. X   }
  1464. X#endif
  1465. X
  1466. X
  1467. Xvoid
  1468. Xprint_reported(tested_caps)
  1469. Xint tested_caps;
  1470. X   {  /* print a list of caps that have been reported as testable */
  1471. X      int i, j, nc;
  1472. X      char *s, *nsp;
  1473. X      char *nx[1024];
  1474. X
  1475. X      nc = 0;
  1476. X      nsp = ns;
  1477. X         for (i = 1; i < NP_SIZE; i++) {
  1478. X               for (s = np[i - 1]; s < np[i]; s += i) {
  1479. X#ifdef TESTCAP
  1480. X                  if (*s == ':')
  1481. X                     {  /* already converted */
  1482. X                        strncpy(nx[nc++] = nsp, s + 1, i - 1);
  1483. X                        nsp[i - 1] = '\0';
  1484. X                        nsp += i;
  1485. X                     }
  1486. X                  else
  1487. X                     {
  1488. X                        j = cap_index(s, i);
  1489. X                        nx[nc++] = (j >= 0) ? &captrans[j][i + 1] : "?";
  1490. X                     }
  1491. X#else
  1492. X                  strncpy(nx[nc++] = nsp, s, i);
  1493. X                  nsp[i] = '\0';
  1494. X                  nsp += i + 1;
  1495. X#endif
  1496. X               }
  1497. X         }
  1498. X      /* sort */
  1499. X         for (i = 0; i < nc - 1; i++)
  1500. X            for (j = i + 1; j < nc; j++) {
  1501. X               if (strcmp(nx[i], nx[j]) > 0) {
  1502. X                  s = nx[i];  nx[i] = nx[j];
  1503. X                  nx[j] = s;
  1504. X               }
  1505. X            }
  1506. X#ifdef TESTCAP
  1507. X      /* smash out duplicates */
  1508. X         for (i = 0, j = 0; ; ) {
  1509. X            nx[i] = nx[j++];
  1510. X            if (j >= nc) break;
  1511. X            if (strcmp(nx[i], nx[j]) != 0) i++;
  1512. X         }
  1513. X      nc = i;
  1514. X      if (tested_caps) report_known(nx, nc);
  1515. X      else
  1516. X#endif
  1517. X         {
  1518. X            ptextln("The following capabilities can be tested by this program:");
  1519. X               for (i = 0; i < nc; i++) {
  1520. X                  sprintf(temp, "%s ", nx[i]);
  1521. X                  ptext(temp);
  1522. X               }
  1523. X            put_crlf();
  1524. X         }
  1525. X   }
  1526. END_OF_FILE
  1527. if test 23144 -ne `wc -c <'output.c'`; then
  1528.     echo shar: \"'output.c'\" unpacked with wrong size!
  1529. fi
  1530. # end of 'output.c'
  1531. fi
  1532. if test -f 'scan.c' -a "${1}" != "-c" ; then 
  1533.   echo shar: Will not clobber existing file \"'scan.c'\"
  1534. else
  1535. echo shar: Extracting \"'scan.c'\" \(7800 characters\)
  1536. sed "s/^X//" >'scan.c' <<'END_OF_FILE'
  1537. X/*
  1538. X** This software is Copyright (c) 1991 by Daniel Weaver.
  1539. X**
  1540. X** Permission is hereby granted to copy, distribute or otherwise
  1541. X** use any part of this package as long as you do not try to make
  1542. X** money from it or pretend that you wrote it.  This copyright
  1543. X** notice must be maintained in any copy made.
  1544. X**
  1545. X** Use of this software constitutes acceptance for use in an AS IS
  1546. X** condition. There are NO warranties with regard to this software.
  1547. X** In no event shall the author be liable for any damages whatsoever
  1548. X** arising out of or in connection with the use or performance of this
  1549. X** software.  Any use of this software is at the user's own risk.
  1550. X**
  1551. X**  If you make modifications to this software that you feel
  1552. X**  increases it usefulness for the rest of the community, please
  1553. X**  email the changes, enhancements, bug fixes as well as any and
  1554. X**  all ideas to me. This software is going to be maintained and
  1555. X**  enhanced as deemed necessary by the community.
  1556. X*/
  1557. X/* scan mode keyboard support */
  1558. X
  1559. X#include "curses.h"
  1560. X#include "ted.h"
  1561. X
  1562. Xextern char *getenv();
  1563. X
  1564. Xint scan_max;  /* length of longest scan code */
  1565. Xchar **scan_up, **scan_down, **scan_name;
  1566. Xint *scan_tested, *scan_length, *scan_value;
  1567. Xint shift_state;
  1568. Xstatic char *str;
  1569. X
  1570. X#define SHIFT_KEY 0x100
  1571. X#define CONTROL_KEY 0x200
  1572. X#define META_KEY 0x400
  1573. X#define CAPS_LOCK 0x800
  1574. X
  1575. Xstruct {
  1576. X    char *name;
  1577. X    int type;
  1578. X} scan_special[] = {
  1579. X    "<shift>", SHIFT_KEY,
  1580. X    "<left shift>", SHIFT_KEY,
  1581. X    "<right shift>", SHIFT_KEY,
  1582. X    "<control>", CONTROL_KEY,
  1583. X    "<left control>", CONTROL_KEY,
  1584. X    "<right control>", CONTROL_KEY,
  1585. X    "<meta>", META_KEY,
  1586. X    "<left meta>", META_KEY,
  1587. X    "<right meta>", META_KEY,
  1588. X    "<caps lock>", CAPS_LOCK,
  1589. X    "<tab>", '\t',
  1590. X    "<space>", ' ',
  1591. X    "<return>", '\r',
  1592. X    "<linefeed>", '\n',
  1593. X    "<formfeed>", '\f',
  1594. X    "<backspace>", '\b',
  1595. X    0, 0};
  1596. X
  1597. Xstatic void
  1598. Xscan_blanks()
  1599. X   {  /* scan past the white space */
  1600. X      while (*str == ' ' || *str == '\t') str++;
  1601. X   }
  1602. X
  1603. Xstatic char *
  1604. Xsmash()
  1605. X   {  /* convert a string to hex */
  1606. X      char *s, *t;
  1607. X      int ch, i, j;
  1608. X
  1609. X      t = s = str;
  1610. X         for (i = 0; ch = *str; str++) {
  1611. X            if (ch >= '0' && ch <= '9') j = ch - '0';
  1612. X            else
  1613. X            if (ch >= 'a' && ch <= 'f') j = 10 - 'a' + ch;
  1614. X            else
  1615. X            if (ch >= 'A' && ch <= 'F') j = 10 - 'A' + ch;
  1616. X            else
  1617. X            if (ch == ' ' || ch == '\t') break;
  1618. X            else continue;
  1619. X            if (i)
  1620. X            {
  1621. X               *s |= j;
  1622. X               s++;
  1623. X            }
  1624. X            else *s = j << 4;
  1625. X            i ^= 1;
  1626. X         }
  1627. X      *s = '\0';
  1628. X      return t;
  1629. X   }
  1630. X
  1631. Xvoid
  1632. Xscan_init(fn)
  1633. Xchar *fn;
  1634. X   {  /* read the scan mode key definitions */
  1635. X      char *s, *sl;
  1636. X      FILE *fp;
  1637. X      int ch, i, j;
  1638. X      char home[512];
  1639. X
  1640. X      if (str = getenv("HOME")) strcpy(home, str);
  1641. X      else home[0] = '\0';
  1642. X      fp = NULL;
  1643. X      if (str = getenv("KEYBOARD"))
  1644. X         {
  1645. X            if (!(fp = fopen(str, "r")) && home[0])
  1646. X               {
  1647. X                  sprintf(temp, "%s/.scan.%s", home, str);
  1648. X                  fp = fopen(temp, "r");
  1649. X               }
  1650. X         }
  1651. X      if (!fp)
  1652. X         {
  1653. X            sprintf(temp, ".scan.%s", fn);
  1654. X            fp = fopen(temp, "r");
  1655. X         }
  1656. X      if (!fp && home[0])
  1657. X         {
  1658. X            sprintf(temp, "%s/.scan.%s", home, fn);
  1659. X            fp = fopen(temp, "r");
  1660. X         }
  1661. X      if (!fp)
  1662. X         {
  1663. X            ptext("Unable to open scanfile: ");
  1664. X            ptextln(temp);
  1665. X            bye_kids(1);
  1666. X            return;
  1667. X         }
  1668. X
  1669. X      /* scan file format:
  1670. X
  1671. X         <down value> <up value> <name>
  1672. X
  1673. X         values are in hex.
  1674. X         <name> may be any string of characters
  1675. X
  1676. X       */
  1677. X      scan_up = (char **)malloc(sizeof(char *) * MAX_SCAN);
  1678. X      scan_down = (char **)malloc(sizeof(char *) * MAX_SCAN);
  1679. X      scan_name = (char **)malloc(sizeof(char *) * MAX_SCAN);
  1680. X      scan_tested = (int *)malloc(sizeof(int *) * MAX_SCAN);
  1681. X      scan_length = (int *)malloc(sizeof(int *) * MAX_SCAN);
  1682. X      scan_value = (int *)malloc(sizeof(int *) * MAX_SCAN);
  1683. X      scan_up[0] = scan_down[0] = scan_name[0] = (char *)0;
  1684. X      str = (char *)malloc(4096);  /* buffer space */
  1685. X      sl = str + 4000;  /* an upper limit */
  1686. X      scan_max = 1;
  1687. X         for (i = 0; ; ) {
  1688. X               for (s = str; (ch = getc(fp)) != EOF; ) {
  1689. X                  if (ch == '\n' || ch == '\r') break;
  1690. X                  *s++ = ch;
  1691. X               }
  1692. X            *s++ = '\0';
  1693. X            if (ch == EOF) break;
  1694. X            if (*str == '#' || *str == '\0') continue;
  1695. X            scan_down[i] = smash();
  1696. X            scan_blanks();
  1697. X            scan_up[i] = smash();
  1698. X            scan_blanks();
  1699. X            scan_name[i] = str;
  1700. X
  1701. X            scan_length[i] = strlen(scan_down[i]);
  1702. X            ch = strlen(scan_up[i]) + scan_length[i];
  1703. X            if (ch > scan_max) scan_max = ch;
  1704. X
  1705. X            scan_value[i] = scan_name[i][0];
  1706. X            if (scan_name[i][1]) /* multi-character name */
  1707. X               for (j = 0; scan_special[j].name; j++) {
  1708. X                  if (!strcmp(scan_name[i], scan_special[j].name))
  1709. X                     {
  1710. X                        scan_value[i] = scan_special[j].type;
  1711. X                        break;
  1712. X                     }
  1713. X               }
  1714. X
  1715. X            i++;
  1716. X            if (str > sl)
  1717. X               {
  1718. X                  str = (char *)malloc(4096);
  1719. X                  sl = str + 4000;
  1720. X               }
  1721. X            else str = s;
  1722. X         }
  1723. X      fclose(fp);
  1724. X#ifdef notdef
  1725. X         for (i = 0; scan_down[i]; i++) {
  1726. X             put_str(hex_expand_to(scan_down[i], 3));
  1727. X             put_str(hex_expand_to(scan_up[i], 3));
  1728. X             put_str("   ");
  1729. X             put_str(scan_name[i]);
  1730. X             put_crlf();
  1731. X         }
  1732. X    (void) wait_here();
  1733. X#endif
  1734. X   }
  1735. X
  1736. Xint
  1737. Xscan_key()
  1738. X   {  /* read a key and translate scan mode to ASCII */
  1739. X      int i, j, ch;
  1740. X      char buf[64];
  1741. X
  1742. X         for (i = 1; ; i++) {
  1743. X            ch = getchar();
  1744. X            if (ch == EOF) return EOF;
  1745. X            if (debug_fp)
  1746. X               {
  1747. X                  fprintf(debug_fp, "%02X ", ch);
  1748. X                  debug_char_count += 3;
  1749. X                  if (debug_char_count > 72)
  1750. X                     {
  1751. X                        fprintf(debug_fp, "\n");
  1752. X                        debug_char_count = 0;
  1753. X                     }
  1754. X               }
  1755. X            buf[i - 1] = ch;
  1756. X            buf[i] = '\0';
  1757. X            if (buf[0] & 0x80) /* scan up */
  1758. X               {
  1759. X                     for (j = 0; scan_up[j]; j++) {
  1760. X                        if (i == scan_length[j] &&
  1761. X                           !strcmp(buf, scan_up[j]))
  1762. X                           {
  1763. X                              i = 0;
  1764. X                              shift_state &= ~scan_value[j];
  1765. X                              break;
  1766. X                           }
  1767. X                     }
  1768. X                  continue;
  1769. X               }
  1770. X               for (j = 0; scan_down[j]; j++) {
  1771. X                  if (i == scan_length[j] && !strcmp(buf, scan_down[j]))
  1772. X                     {
  1773. X                        i = 0;
  1774. X                        shift_state |= scan_value[j];
  1775. X                        ch = scan_value[j];
  1776. X                        if (ch == CAPS_LOCK) shift_state ^= SHIFT_KEY;
  1777. X                        if (ch >= 256) break;
  1778. X                        if (shift_state & SHIFT_KEY)
  1779. X                           if (ch >= 0x60) ch -= 0x20;
  1780. X                           else
  1781. X                           if (ch >= 0x30 && ch <= 0x3f) ch -= 0x10;
  1782. X                        if (shift_state & CONTROL_KEY)
  1783. X                           if ((ch | 0x20) >= 0x60 &&
  1784. X                              (ch | 0x20) <= 0x7f)
  1785. X                              ch = (ch | 0x20) - 0x60;
  1786. X                        if (shift_state & META_KEY) ch |= 0x80;
  1787. X                        return ch;
  1788. X                     }
  1789. X               }
  1790. X            if (i > scan_max) i = 1;
  1791. X         }
  1792. X   }
  1793. END_OF_FILE
  1794. if test 7800 -ne `wc -c <'scan.c'`; then
  1795.     echo shar: \"'scan.c'\" unpacked with wrong size!
  1796. fi
  1797. # end of 'scan.c'
  1798. fi
  1799. echo shar: End of archive 6 \(of 7\).
  1800. cp /dev/null ark6isdone
  1801. MISSING=""
  1802. for I in 1 2 3 4 5 6 7 ; do
  1803.     if test ! -f ark${I}isdone ; then
  1804.     MISSING="${MISSING} ${I}"
  1805.     fi
  1806. done
  1807. if test "${MISSING}" = "" ; then
  1808.     echo You have unpacked all 7 archives.
  1809.     rm -f ark[1-9]isdone
  1810. else
  1811.     echo You still need to unpack the following archives:
  1812.     echo "        " ${MISSING}
  1813. fi
  1814. ##  End of shell archive.
  1815. exit 0
  1816.  
  1817. exit 0 # Just in case...
  1818. -- 
  1819. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1820. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1821. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1822. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1823.